package com.palfund.greendao;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

import com.palfund.greendao.greendao.gen.DaoMaster;
import com.palfund.greendao.greendao.gen.DaoSession;
import com.palfund.greendao.greendao.gen.StudentDao;

import org.greenrobot.greendao.query.Query;

import java.util.List;

public class MainActivity extends AppCompatActivity {
    //链接http://blog.csdn.net/Hi_AndG/article/details/54695725
    private StudentDao mStudentDao;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 初始化
        DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(getApplicationContext
                (), "student.db", null);
        DaoMaster daoMaster = new DaoMaster(devOpenHelper.getWritableDb());
        DaoSession daoSession = daoMaster.newSession();
        mStudentDao = daoSession.getStudentDao();
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(1, 1, 1, "insert");
        menu.add(1, 2, 1, "delete");
        menu.add(1, 3, 1, "upDate");
        menu.add(1, 4, 1, "query");
        menu.add(1, 5, 1, "query0");
        return super.onCreateOptionsMenu(menu);
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case 1:
                //增
                mStudentDao.deleteAll();
                for (long i = 0; i < 10; i++) {
                    Student student = new Student(i, "name_" + i, "city_" + i, i);
                    mStudentDao.insert(student);//当指定主键在表中存在时会发生异常
                    //mStudentDao.insertOrReplace();// 当指定主键在表中存在时会覆盖数据
                    //mStudentDao.insertInTx();//批量插入数据
                }
                break;
            case 2:
                //删  根据数据库中的Id删除
                mStudentDao.delete(new Student(0L, "name_0", "city_0", 0L));
                Student student1 = new Student();
                student1.setId(1L);
                mStudentDao.delete(student1);//删除数据
                Student student2 = new Student(2L, "name", "city", 0);
                mStudentDao.delete(student2);
                mStudentDao.deleteByKey(9L);// 指定主键删除数据
                //mStudentDao.deleteInTx();//  批量删除数据
                //mStudentDao.deleteByKeyInTx();//批量按数据删除数据
                //mStudentDao.deleteAll();//删除所有数据
                break;
            case 3:
                //改  根据数据库中的Id更新
                mStudentDao.update(new Student(3L, "name_update", "city_3", 0));
                Student student4 = new Student();
                student4.setId(4L);
                student4.setName("name_update");
                mStudentDao.update(student4);
                //mStudentDao.updateInTx();//批量更新数据
                break;
            case 4:
                //查
                List<Student> listQuery = mStudentDao.queryBuilder()
                        //数据筛选
                        .where(StudentDao.Properties.Name.eq("name_5"))
                        //偏移量
                        .offset(0)
                        //只获取结果集的前 3 个数据
                        .limit(3)
                        //通过 name 这个属性进行正序排序
                        .orderAsc(StudentDao.Properties.Name).build().list();
                //list() 所有实体会直接加载到内存中。
                //listLazy() 当你需要使用时，才会加载，会自动缓存。使用完必须关闭。
                //listLazyUncached() 如你所见，就是不会缓存的意思。使用完必须关闭。
                //listIterator() 通过迭代器遍历结果集，不会缓存。使用完必须关闭。
                //unique() 返回一个或者零个结果
                //uniqueOrThrow() 返回非空的结果，否则抛出异常
                /**
                 listLazy()、listLazyUncached()、listIterator()这三个方法都使用了LazyList.class这个类.
                 它持有了数据库游标的引用,这就是为什么要关闭的原因.当然,当你遍历完所有的结果集,它是会自动关闭的.
                 如果没有遍历完,就得手动关闭了.
                 */
                Log.i("MainActivity", "---onOptionsItemSelected()--->" + listQuery.get(0));
                //mStudentDao.load()//根据key查找
                //mStudentDao.loadByRowId()//根据行号查找数据
                //mStudentDao.loadAll()//查找全部数据

                break;
            case 5:
                Query<Student> query = mStudentDao.queryBuilder().build();
                List<Student> queryList = query.list();
                Log.i("MainActivity", "---onOptionsItemSelected()--->" + queryList.get(0));
                break;
        }
        return super.onOptionsItemSelected(item);
    }


}
